﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Beeldbankmvc.Models;

namespace Beeldbankmvc.Code
{
    public class PriceObject
    {
        public Double totaleKostenAlleItems { get; set; }
        public Double totalePlusBehandelingsKosten { get; set; }
        public Double aantalScans { get; set; }
        public Double verzendKosten { get; set; }
        public Double totaleKostenZonderBTW { get; set; }
        public Double totaleKorting { get; set; }
        public Double btw { get; set; }
        public Double uiteindelijkeBestelKosten { get; set; }
        public Double FTPKosten { get; set; }
    }


    public static class PriceCalculator
    {
        // TODO move this code to a model where shoppingcart index can also access it
        public static PriceObject priceItemsInShoppingCartByName(String shoppingCartId)
        {
            BeeldbankLinqDataContext beeldBankDB = new BeeldbankLinqDataContext();

            // Select the shoppingcart items for the current user
            var winkelWagenRegels = from ww in beeldBankDB.BEELDBANK_ORDERREGEL_WINKELWAGENs where ww.WinkelwagenId == shoppingCartId select ww;

            // calculate price
            PriceInfoRepository priceInfoRepository = new PriceInfoRepository();
            Double totaleKosten = 0;
            int aantalScans = 0;
            int aantalFTP = 0;
            bool fysiekMateriaal = false;

            // iterate trough the shoppingcart items and add each item to an order row, while deleting it from the orriginal table
            foreach (var winkelWagenRegel in winkelWagenRegels)
            {
                // aantal en post berekening    
                if (winkelWagenRegel.MediaTypeId == (int)Mediatypes.MediaTypes.analog)
                {
                    aantalScans += Convert.ToInt32(winkelWagenRegel.Aantal);
                }
                if ((winkelWagenRegel.Afwerking != null && winkelWagenRegel.Afwerking.Equals("scan via post")) || winkelWagenRegel.MediaTypeId == (int)Mediatypes.MediaTypes.video_animation)
                {
                    fysiekMateriaal = true;
                }

                // aantal ftp berekening
                if (winkelWagenRegel.Afwerking != null && winkelWagenRegel.Afwerking.Equals("scan via FTP"))
                    aantalFTP++;

                // Bereken kosten per stuk van dit item
                Double kostenPerStuk = priceInfoRepository.totalPrice(winkelWagenRegel.MediaTypeId, winkelWagenRegel.Type, winkelWagenRegel.Formaat, 1).price;

                // Hoog de totale kosten op
                totaleKosten += kostenPerStuk * Convert.ToInt32(winkelWagenRegel.Aantal);
            }

            // TODO: Berekenings gedeelte verplaatsten naar Model
            Double totaleKostenZonderBTW = 0;

            // Behandelings kosten
            Double totalePlusBehandelingsKosten = totaleKosten + 25;
            totaleKostenZonderBTW = totaleKosten + 25;

            // Korting digitaliseren analoge media
            Double totaleKorting = 0;
            if (aantalScans <= 5)
            {
                // geen korting
                // totaleScanKosten = aantalScans * 0;
            }
            else if (aantalScans > 5 && aantalScans <= 10)
            {
                // 1.00 korting per scan
                totaleKorting = aantalScans * 1.0;
            }
            else if (aantalScans > 10 && aantalScans <= 20)
            {
                // 2.00 korting per scan
                totaleKorting = aantalScans * 2.0;
            }
            else if (aantalScans > 20)
            {
                // 3.00 korting per scan
                totaleKorting = aantalScans * 3.0;
            }

            totaleKostenZonderBTW -= totaleKorting;

            // Verzend kosten
            Double verzendKosten = 0;
            if (fysiekMateriaal)
            {
                verzendKosten = 3;
                totaleKostenZonderBTW += 3;
            }

            // FTP kosten
            Double FTPKosten = 1.30 * aantalFTP;
            totaleKostenZonderBTW += FTPKosten;

            // BTW kosten
            Double btw = totaleKostenZonderBTW * 0.21;

            // Totaal plus BTW kosten                  
            Double totaalPlusBTW = totaleKostenZonderBTW + btw;

            // populate the priceobject
            PriceObject prijsObject = new PriceObject();
            prijsObject.aantalScans = aantalScans;
            prijsObject.btw = btw;
            prijsObject.uiteindelijkeBestelKosten = totaalPlusBTW;
            prijsObject.totaleKostenAlleItems = totaleKosten;
            prijsObject.totaleKostenZonderBTW = totaleKostenZonderBTW;
            prijsObject.totalePlusBehandelingsKosten = totalePlusBehandelingsKosten;
            prijsObject.verzendKosten = verzendKosten;
            prijsObject.totaleKorting = totaleKorting;
            prijsObject.FTPKosten = FTPKosten;

            return prijsObject;
        }

    }
}